import request from '@/utils/request'
// 常量定义
const ACCESS_TOKEN_KEY = 'ys7_access_token'
const EXPIRE_TIME_KEY = 'ys7_expire_time'



/**
 * 清除缓存的accessToken
 */
export function clearCachedAccessToken() {
  localStorage.removeItem(ACCESS_TOKEN_KEY)
  localStorage.removeItem(EXPIRE_TIME_KEY)
}
/**
 * 缓存accessToken（内部辅助方法）
 */
function cacheAccessToken(token, expireTime) {
  localStorage.setItem(ACCESS_TOKEN_KEY, token)
  localStorage.setItem(EXPIRE_TIME_KEY, expireTime.toString())
}
/**
 * 远程抓拍照片
 * @param {String} serial - 摄像头序列号
 * @param {String} accessToken - 访问令牌
 * @returns {Promise<Object>} - 抓图结果
 */
export async function captureImage(formData) {
  try {
    const response = await fetch('http://localhost:3000/api/ys7/capture', {
      method: 'POST',
      headers: { 
        'Content-Type': 'application/x-www-form-urlencoded' 
      },
      body: formData.toString()
    });

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const data = await response.json();
    return { success: true, data };
  } catch (error) {
    console.error('捕获请求失败:', error);
    return { success: false, error: error.message };
  }
}


export async function getUrl(formData) {
  try {
    const response = await fetch('https://open.ys7.com/api/lapp/v2/live/address/get', {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: formData.toString()
    });
    if (!response.ok) {
      throw new Error(`HTTP错误: ${response.status}`);
    }
    const data = await response.json();
    // 校验萤石云接口返回的code
    if (data.code !== '200' || !data.data?.url) {
      throw new Error(`接口返回错误: ${data.msg || '未知错误'}`);
    }
    return { success: true, data: data.data }; // 确保data中包含url
  } catch (error) {
    console.error('获取播放地址失败:', error);
    return { success: false, error: error.message };
  }
}

/**
 * 获取萤石云accessToken（从数据库获取并判断是否需要刷新）
 * @param {String} appKey - 应用appKey
 * @param {String} appSecret - 应用appSecret
 * @returns {Promise<Object>} - 包含accessToken和expireTime的对象
 */
export async function getYSAccessToken(appKey, appSecret) {
  try {
    // 1. 先从数据库查询token记录
    const dbResponse = await getTokenFromDB(appKey);
    
    if (dbResponse.code !== 200 || !dbResponse.data) {
      throw new Error('获取数据库token记录失败');
    }
    
    const { accessToken: dbToken, lastActiveTime, expireIn } = dbResponse.data;
    const currentTime = Date.now();
    
    // 2. 计算token是否有效（当前时间 - 最后活动时间 < 有效期）
    const isTokenValid = (currentTime - lastActiveTime) < (expireIn * 1000);
    
    if (isTokenValid) {
      // 3. 有效则直接使用数据库中的token
      cacheAccessToken(dbToken, lastActiveTime + expireIn * 1000);
      return {
        code: 200,
        message: '使用数据库中的有效token',
        data: {
          accessToken: dbToken,
          expireTime: lastActiveTime + expireIn * 1000,
          source: 'database'
        }
      };
    }
    
    // 4. 无效则重新请求新token
    const newTokenResponse = await request({
      url: 'https://open.ys7.com/api/lapp/token/get',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      data: {
        appKey,
        appSecret
      }
    });
    
    // 5. 检查新token是否获取成功
    if (newTokenResponse.code !== 200 || !newTokenResponse.data?.accessToken) {
      throw new Error('获取新token失败: ' + (newTokenResponse.message || '未知错误'));
    }
    
    const { accessToken: newToken } = newTokenResponse.data;
    const newLastActiveTime = currentTime;
    
    // 6. 更新数据库中的token记录
    const updateResult = await updateTokenInDB(
      appKey, 
      newToken, 
      newLastActiveTime, 
      expireIn
    );
    
    if (updateResult.code !== 200) {
      console.warn('数据库token更新失败，但新token已获取');
    }
    
    // 7. 缓存新token
    cacheAccessToken(newToken, newLastActiveTime + expireIn * 1000);
    
    return {
      code: 200,
      message: 'token已过期,已获取新token并更新数据库',
      data: {
        accessToken: newToken,
        expireTime: newLastActiveTime + expireIn * 1000,
        source: 'newly_fetched'
      }
    };
    
  } catch (error) {
    console.error('获取accessToken失败:', error);
    return {
      code: 500,
      message: error.message,
      data: null
    };
  }
}
/**
 * 向指定分区添加摄像头
 * @param {Object} params - 请求参数
 * @param {string} params.zoneId - 分区ID
 * @param {string} params.name - 设备名称
 * @param {string} params.serial - 设备序列号
 * @param {string} params.appKey - 设备AppKey
 * @param {string} params.appSecret - 设备AppSecret
 * @returns {Promise} - 返回请求的Promise对象
 */
export const addCameraToZone = (params) => {
  return request({
    url: '/api/zone/camera/add',
    method: 'post',
    data: params
  })
}
/**
 * 从指定分区移除摄像头
 * @param {Object} params - 请求参数
 * @param {string} params.zoneId - 分区ID
 * @param {string} params.deviceSerial - 设备序列号
 * @returns {Promise} - 返回请求的Promise对象
 */
export const removeCameraFromZone = (params) => {
  return request({
    url: '/api/zone/camera/remove',
    method: 'post',
    data: params
  })
}





//模拟方法
// 模拟设备数据
const zones = [
  { 
    id: 1,
    name: '区域1', 
    devices: [
      { 
        serial: 'GC5437873', 
        name: '区域1-摄像头1', 
        appKey: 'fa85748e0ac1412dbc948e7082c65945', 
        appSecret: 'd6575d816f65f9e77a9d07815c3e112f',
        password:'260410'
      },
      { 
        serial: 'GC1837351', 
        name: '区域1-摄像头2', 
        appKey: 'fa85748e0ac1412dbc948e7082c65945', 
        appSecret: 'd6575d816f65f9e77a9d07815c3e112f',
        password:'' 
      },
      { 
        serial: 'GC5437872', 
        name: '区域1-摄像头3', 
        appKey: 'f', 
        appSecret: 'd' ,
        password:''
      }
    ]
  },
  // 可以添加更多区域
  { 
    id: 2,
    name: '区域2', 
    devices: [
      { 
        serial: 'GC5437876', 
        name: '区域2-摄像头1', 
        appKey: 'a', 
        appSecret: 'b',
        password:''
      },
      { 
        serial: 'GC5437877', 
        name: '区域2-摄像头2', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437878', 
        name: '区域2-摄像头3', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437879', 
        name: '区域2-摄像头4', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437810', 
        name: '区域2-摄像头5', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437811', 
        name: '区域2-摄像头6', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437812', 
        name: '区域2-摄像头7', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      { 
        serial: 'GC5437813', 
        name: '区域2-摄像头8', 
        appKey: 'a', 
        appSecret: 'b' ,
        password:''
      },
      
    ]
  }
];
// 模拟请求延迟
const mockRequest = (handler, delay = 300) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(handler());
    }, delay);
  });
};
/**
 * 模拟API：从数据库获取accessToken记录
 * @param {String} appKey - 应用appKey
 * @returns {Promise<Object>} - 数据库中的token记录
 */
export async function getTokenFromDB(appKey) {
  // 模拟数据库查询延迟
  return new Promise(resolve => {
    setTimeout(() => {
      // 模拟数据库返回结果
      resolve({
        code: 200,
        message: 'success',
        data: {
          accessToken: 'at.26hmw9ov6ry7qiyca6ayn9nb8a9p1drc-58hoztj5u6-016cwn2-u7afoyxvk', // 数据库中存储的token
          lastActiveTime: Date.now() - 3600000, // 1小时前的时间戳
          expireIn: 7200 // 有效期（秒）
        }
      });
    }, 200);
  });
}
/**
 * 模拟API：更新数据库中的accessToken记录
 * @param {String} appKey - 应用appKey
 * @param {String} accessToken - 新的accessToken
 * @param {Number} lastActiveTime - 最后活动时间戳
 * @returns {Promise<Object>} - 更新结果
 */
export async function updateTokenInDB(appKey, accessToken, lastActiveTime, expireIn) {
  // 模拟数据库更新延迟
  return new Promise(resolve => {
    setTimeout(() => {
      // 模拟数据库更新结果
      resolve({
        code: 200,
        message: 'token updated successfully',
        data: {
          affectedRows: 1
        }
      });
    }, 200);
  });
}
// 模拟API:修改getAllZones使其返回完整的分区信息，包括设备列表
export function getAllZones() {
  return mockRequest(() => {
    return {
      code: 200,
      message: 'success',
      data: zones // 返回完整的分区数据，包含devices数组
    };
  });
}
/**
 * 模拟API:根据设备序列号获取摄像头详细信息（包含appKey和appSecret）
 * @param {String} serial - 摄像头序列号
 * @returns {Promise<Object>} - 包含设备详情的响应对象
 */
export function getCameraDetail(serial) {
  return mockRequest(() => {
    // 遍历所有区域查找匹配的设备
    for (const zone of zones) {
      const device = zone.devices.find(d => d.serial === serial);
      if (device) {
        return {
          code: 200,
          message: 'success',
          data: {
            serial: device.serial,
            name: device.name,
            appKey: device.appKey,
            appSecret: device.appSecret,
            zoneId: zone.id,
            zoneName: zone.name,
            password: device.password
          }
        };
      }
    }
    
    // 如果未找到设备
    return {
      code: 404,
      message: `未找到序列号为${serial}的设备`,
      data: null
    };
  });
}
    